/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.CorreoDto;
import com.brain.core.dto.UsuarioDto;
import com.brain.core.exception.DAOException;
import com.brain.core.exception.ServiceException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.context.FacesContext;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class UsuarioManager extends ComunManager<UsuarioDto> implements Serializable {

    @Resource
    private DAOGenerico<UsuarioDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(ParametroManager.class);

    public List<UsuarioDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(UsuarioDto.class);
    }

    public List<UsuarioDto> obtenerConFiltro(Map<String, Object> filtros) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltros(UsuarioDto.class, filtros);
    }

    public List<UsuarioDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(UsuarioDto.class, filtros, orden);
    }

    public List<UsuarioDto> obtenerTodosActivos() throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("estado", Boolean.TRUE);
        Map<String, String> orden = new HashMap<String, String>();
        orden.put("descripcion", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(UsuarioDto.class, filtros, orden);
    }

    public List<UsuarioDto> obtenerConsultores() throws DAOException {
        Long entidad = ConstantesCore.Entidad.USUARIO;
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");

        String hqsql = "select e from UsuarioDto as e, PropietarioDto as pro where "
                + " pro.estado = ? and pro.propietarioDtoPK.entidad = ? and pro.propietarioDtoPK.organizacionDto.id = ?"
                + " and pro.propietarioDtoPK.registro = e.id and e.estado=? and e.rolDto.esConsultorOferta=?";
        List<Object> listaParametros = new ArrayList<Object>();
        listaParametros.add(Boolean.TRUE);
        listaParametros.add(entidad);
        listaParametros.add(sessionMBean.getSessionOrganizacionDto().getId());
        listaParametros.add(Boolean.TRUE);
        listaParametros.add(Boolean.TRUE);

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public UsuarioDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(UsuarioDto.class, id);
    }

    public boolean esValidoLogin(UsuarioDto usuarioDto) {
        boolean retorno = false;
        try {

            List<Object> listaParametros = new ArrayList<Object>();
            String hqsql = "select p from UsuarioDto as p where ";
            hqsql += " upper(p.login) = '" + usuarioDto.getLogin().toUpperCase() + "'";
            if (usuarioDto.getId() != null) {
                hqsql += " and p.id != " + usuarioDto.getId();
            }

            List<UsuarioDto> usuarios = springHibernateDao.ejecutarQuery(hqsql, listaParametros);
            if (usuarios != null && usuarios.size() > 0) {
                retorno = false;
            } else {
                retorno = true;
            }

        } catch (DAOException ex) {
            logger.error(ex);
            retorno = false;
        }

        return retorno;
    }

    public boolean esValidoEmail(UsuarioDto usuarioDto) {
        boolean retorno = false;
        try {

            List<Object> listaParametros = new ArrayList<Object>();
            String hqsql = "select p from UsuarioDto as p where ";
            hqsql += " upper(p.emailLaboral) = '" + usuarioDto.getEmailLaboral().toUpperCase() + "'";
            if (usuarioDto.getId() != null) {
                hqsql += " and p.id != " + usuarioDto.getId();
            }

            List<UsuarioDto> usuarios = springHibernateDao.ejecutarQuery(hqsql, listaParametros);
            if (usuarios != null && usuarios.size() > 0) {
                retorno = false;
            } else {
                retorno = true;
            }

        } catch (DAOException ex) {
            logger.error(ex);
            retorno = false;
        }

        return retorno;
    }

    public List<UsuarioDto> obtenerUsuarios(UsuarioDto dtoFiltro) throws DAOException {


        Long entidad = ConstantesCore.Entidad.USUARIO;
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");

        String hqsql = "select e from UsuarioDto as e, PropietarioDto as pro where "
                + " pro.estado = ? and pro.propietarioDtoPK.entidad = ? and pro.propietarioDtoPK.organizacionDto.id = ?"
                + " and pro.propietarioDtoPK.registro = e.id";
        List<Object> listaParametros = new ArrayList<Object>();
        listaParametros.add(Boolean.TRUE);
        listaParametros.add(entidad);
        listaParametros.add(sessionMBean.getSessionOrganizacionDto().getId());

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        } else {
            dtoFiltro.setId(null);
        }
        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%'";
        }

        if (dtoFiltro.getLogin() != null && dtoFiltro.getLogin().length() != 0) {
            hqsql += " and upper(e.login) like '%" + dtoFiltro.getLogin().toUpperCase() + "%'";
        }

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<UsuarioDto> obtenerUsuariosMantenimiento(UsuarioDto dtoFiltro) throws DAOException {




        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();


        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        } else {
            //dtoFiltro.setId(null);

            if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
                hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%'";
            }

            if (dtoFiltro.getLogin() != null && dtoFiltro.getLogin().length() != 0) {
                hqsql += " and upper(e.login) like '%" + dtoFiltro.getLogin().toUpperCase() + "%'";
            }

            if (dtoFiltro.getRolDto().getDescripcion() != null && dtoFiltro.getRolDto().getDescripcion().length() != 0) {
                hqsql += " and upper(e.rolDto.descripcion) like '%" + dtoFiltro.getRolDto().getDescripcion().toUpperCase() + "%'";
            }
        }
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<UsuarioDto> obtenerUsuariosMantenimientoAutocomplete(final String sqr) throws DAOException {

        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and (upper(e.descripcion) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.login) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.rolDto.descripcion) like '%" + sqr.toUpperCase() + "%')";

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
    
    /**
     * Este metodo obtiene los usuario que sean empleados CMAC
     * @param sqr
     * @return
     * @throws DAOException 
     */
    public List<UsuarioDto> obtenerUsuariosQueSeanEmpleadosCMAC(final String sqr) throws DAOException {

        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and (upper(e.descripcion) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.login) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.rolDto.descripcion) like '%" + sqr.toUpperCase() + "%')";
        
        hqsql += " and exists( select 'X' from PersonaDto as p where p.usuarioSistemaDto.id = e.id  and p.emp = 1)";

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public boolean usuarioEsValido(UsuarioDto usuarioDto) {
        boolean retorno = true;
        if (!esValidoLogin(usuarioDto)) {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("usuario.login.ya.existe"));
            retorno = false;
        }

        if (!esValidoEmail(usuarioDto)) {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("usuario.email.ya.existe"));
            retorno = false;
        }

        return retorno;
    }

    public int enviarEmail(UsuarioDto usuario) {
        int retorno = -1;
        CorreoElectronicoManager managerEmail = (CorreoElectronicoManager) WebServletContextListener.getApplicationContext().getBean("correoElectronicoManager");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        CorreoDto dto = new CorreoDto();
        dto.setAsunto(applicationMBean.getNombreSistema());
        dto.setCuerpo(formatoNuevoUsuario(usuario));
        String[] to = new String[1];
        to[0] = usuario.getEmailLaboral();
        dto.setTo(to);
        try {
            retorno = managerEmail.enviar(dto);
            System.out.println("RETORNO ENVIO EMAIL : " + retorno);
            return retorno;
        } catch (UnsupportedEncodingException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;

        } catch (MessagingException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;
        } catch (ServiceException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;
        }
    }

    private String formatoNuevoUsuario(UsuarioDto usuarioDto) {
        String retorno = null;
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

        StringBuffer mensaje = new StringBuffer();
        mensaje.append("<html>");
        mensaje.append("<head>");
        mensaje.append("	<style>");
        mensaje.append("		* {");
        mensaje.append("			font-size: 100%;");
        mensaje.append("			font-family: Tahoma, Lucida Grande, Lucida Sans, Arial, sans-serif;");
        mensaje.append("			letter-spacing: .03em;");
        mensaje.append("		}");
        mensaje.append("		body {");
        mensaje.append("			font-size: 0.7em;");
        mensaje.append("			overflow: auto;");
        mensaje.append("			padding: 4px;");
        mensaje.append("			margin: 4px;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr td");
        mensaje.append("		, table.dataTable tr th");
        mensaje.append("		, table.dataTable tr td.last");
        mensaje.append("		, table.dataTable tr th.last");
        mensaje.append("		, table.dataTable tr.last td");
        mensaje.append("		, table.dataTable tr.last th {");
        mensaje.append("			border-left:1px solid #000;");
        mensaje.append("			border-top:1px solid #000;");
        mensaje.append("			padding:2px;");
        mensaje.append("			margin:2px;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr td.last");
        mensaje.append("		, table.dataTable tr th.last {");
        mensaje.append("			border-right:1px solid #000;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr.last td");
        mensaje.append("		, table.dataTable tr.last th {");
        mensaje.append("			border-bottom:1px solid #000;");
        mensaje.append("		}");
        mensaje.append("	</style>");
        mensaje.append("</head>");
        /*CUERPO DE MENSAJE*/
        mensaje.append("<body>");
        /*TITULO DEL MENSAJE*/
        mensaje.append("<hr/>");
        mensaje.append("<b style='font-size: 115%;'><center>" + applicationMBean.getNombreSistema() + " : NUEVO USUARIO</center></b>");
        mensaje.append("<hr/>");
        mensaje.append("<br>");
        mensaje.append("Estimado " + usuarioDto.getDescripcion() + " se ha creado un usuario para el sistema : " + applicationMBean.getNombreSistema() + " su credenciales son las siguientes para acceder al sistema:");
        mensaje.append("<br>");

        mensaje.append("<table>");

        mensaje.append("	<tr>");
        mensaje.append("		<td>USUARIO :</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getLogin() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>CONTRASEÑA</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getContrasenaActual() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>ROL :</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getRolDto().getDescripcion() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>URL APLICACIÓN</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + request.getContextPath() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("</table>");
        mensaje.append("</body>");
        mensaje.append("</html>");

        return mensaje.toString();
    }
}
